/**
 * 将对象转换为URL参数字符串
 * @param params 参数对象
 * @returns 拼接好的参数字符串，开头带 ?
 * @example
 * // 返回 "?name=test&age=18"
 * buildParams({ name: "test", age: 18 })
 * 
 * // 返回 "?name=test&list=1,2,3"
 * buildParams({ name: "test", list: [1,2,3] })
 */
export function buildParams(params: Record<string, any>): string {
  if (!params || Object.keys(params).length === 0) {
    return ''
  }

  const parts: string[] = []
  
  Object.entries(params).forEach(([key, value]) => {
    if (value !== null && value !== undefined && value !== '') {
      if (Array.isArray(value)) {
        // 数组转换为逗号分隔的字符串
        parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value.join(','))}`)
      } else if (value instanceof Date) {
        // 日期转换为ISO字符串
        parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value.toISOString())}`)
      } else if (typeof value === 'object') {
        // 对象转换为JSON字符串
        parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(JSON.stringify(value))}`)
      } else {
        parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
      }
    }
  })

  return parts.length > 0 ? `?${parts.join('&')}` : ''
}

/**
 * 构建完整的URL（基础URL + 参数）
 * @param baseUrl 基础URL
 * @param params 参数对象
 * @returns 完整的URL
 * @example
 * // 返回 "/api/list?name=test&age=18"
 * buildUrl("/api/list", { name: "test", age: 18 })
 */
export function buildUrl(baseUrl: string, params?: Record<string, any>): string {
  if (!params) {
    return baseUrl
  }
  
  // 移除baseUrl末尾的/
  const cleanBaseUrl = baseUrl.replace(/\/+$/, '')
  const queryString = buildParams(params)
  
  return `${cleanBaseUrl}${queryString}`
}

/**
 * 解析URL参数为对象
 * @param url URL字符串
 * @returns 参数对象
 * @example
 * // 返回 { name: "test", age: "18" }
 * parseUrlParams("/api/list?name=test&age=18")
 */
export function parseUrlParams(url: string): Record<string, string> {
  const params: Record<string, string> = {}
  const queryString = url.split('?')[1]
  
  if (!queryString) {
    return params
  }
  
  queryString.split('&').forEach(part => {
    const [key, value] = part.split('=')
    if (key && value) {
      params[decodeURIComponent(key)] = decodeURIComponent(value)
    }
  })
  
  return params
}
